package reflect;

import java.io.File;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.URISyntaxException;

/**
 * 自动调用与当前类ReflectDemo7所在同一个包中，自动调用本类自己定义的无参方法。
 */
public class ReflectDemo7 {
    /**
     * main方法上的参数String[] args的作用是
     * 在命令行上使用java命令指定当前类时，可以传递参数过来，此时会被main上的String[] args接收
     *
     * 列如:
     * java ReflectDemo7 arg1 arg2 arg3
     * main方法执行后，args数组就三个元素，对应的就是“arg1“,"arg2","arg3"。
     *
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        /*
        两个开发中常用的相对路径
         */
//        File file = new File(ReflectDemo7.class.getClassLoader().getResource(".").toURI());
//        String path = file.getAbsolutePath();
//        System.out.println(path);
        Class cls = null;
        File file = new File(ReflectDemo7.class.getResource(".").toURI());
        String packgeName = ReflectDemo7.class.getPackage().getName();
        String path = file.getAbsolutePath();
        System.out.println(path);
        File[] subs = file.listFiles(f->f.getName().endsWith(".class"));
        for (File sub : subs) {
            String fileName = sub.getName();
//            System.out.println(fileName);
//            String[] className = fileName.split(".class");
            String classname = fileName.substring(0,fileName.indexOf("."));
//            System.out.println(className[0]);
            cls = Class.forName(packgeName+"."+classname);
            Object obj = cls.newInstance();
            Method[] methods = cls.getDeclaredMethods();
            for (Method method : methods) {
                if(method.getParameterCount()==0 && method.getModifiers()== Modifier.PUBLIC){  //modifier: 修饰成分。

                    System.out.println("自动调用的方法名："+method.getName());
                    method.invoke(obj);
                }
            }
        }


    }
}
